(function () {

   /*
   *   以abstract开头的类是抽象类，
   *       抽象类和其他类区别不大，只是不能用来创建对象
   *       抽象类就是专门用来被继承的类
   *
   *       抽象类中可以添加抽象方法
   * */
   abstract class Animal {
      name: string;

      constructor(name: string) {
         this.name = name;
      }

      // 定义一个抽象方法
      // 抽象方法使用 abstract开头，没有方法体
      // 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
      abstract sayHello(): void;
   }

   class Dog extends Animal {
      sayHello() {
         console.log('~汪汪');
      }
      run() {
         console.log(`${this.name}再跑`);
      }
   }

   const dog = new Dog('旺财');
   dog.sayHello();


   class Cat extends Animal {

      constructor(name: string) {
         super(name)
      }
      sayHello(): string {
         console.log('喵喵');
         return '喵喵'
      }
   }
   let c = new Cat('laomao')
   console.log(c.name, c.sayHello());

})();